/*
 * Created by LiuYou on 2020/12/17.
 *
 */

#include <iostream>
#include "notebook/NoteBook.hpp"
#include "notebook/AocDisplay.hpp"
#include "notebook/NvidiaGraphicsCard.hpp"

int main() {
    NoteBook::NoteBook noteBook(std::make_shared<NoteBook::Display::AocDisplay>(100, "满意vs"),
                                std::make_shared<NoteBook::GraphicsCard::NvidiaGraphicsCard>(100, "需要提高vs"));

    std::cout << noteBook.getDisplay() << std::endl;
    std::cout << noteBook.getGraphicsCard() << std::endl;

    // TODO 注意: 这里执行的是父类Display和GraphicsCard的流输出运算符。而不是子类AocDisplay和NvidiaGraphicsCard的流输出运算符。
    std::cout << "Display: " << *noteBook.getDisplay() << std::endl;
    std::cout << "GraphicsCard: " << *noteBook.getGraphicsCard() << std::endl;

    // TODO 注意: 如果要执行子类的流输出运算符必须进行强转，将父类的指针强转为子类的指针。
    //  也可以像Java那样实现一个继承的toString方法，这样的话就不需要进行强转了。
//    NoteBook::Display::AocDisplay* aocDisplay = dynamic_cast<NoteBook::Display::AocDisplay*>(noteBook.getDisplay().get());
    auto* aocDisplay = dynamic_cast<NoteBook::Display::AocDisplay*>(noteBook.getDisplay().get());
    std::cout << *aocDisplay << std::endl;
//    NoteBook::GraphicsCard::NvidiaGraphicsCard* nvidiaGraphicsCard = dynamic_cast<NoteBook::GraphicsCard::NvidiaGraphicsCard*>(noteBook.getGraphicsCard().get());
    auto* nvidiaGraphicsCard = dynamic_cast<NoteBook::GraphicsCard::NvidiaGraphicsCard*>(noteBook.getGraphicsCard().get());
    std::cout << *nvidiaGraphicsCard << std::endl;


    /*
     * 下面不实用，也不适用。
     *
     * 注意:
     * 注释有汉字，VS C++也会警告
     * warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
     * 不过没有关系。
     */
/*    const auto& aoc = noteBook.getDisplay();
    std::cout << *aoc << std::endl;
    const auto& nvidia = noteBook.getGraphicsCard();
    std::cout << *nvidia << std::endl;

    auto aoc1 = noteBook.getDisplay().get();
    std::cout << *aoc1 << std::endl;
    auto nvidia1 = noteBook.getGraphicsCard().get();
    std::cout << *nvidia1 << std::endl;*/


    return 0;
}